﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using GS1.Entidad;
using System.Data;
using GS1.DataAccess;
using log4net;
using Oracle.DataAccess.Client;


namespace GS1.Datos
{
    public class EtiquetaDA
    {
        #region --- Variables y Constantes ---
        private static readonly ILog log = LogManager.GetLogger(typeof(EtiquetaDA));

        // Nombre procedimiento almacenado
        private const string PROCEDIMIENTO_RFID_REGISTRARETIQUETA = "BETA.PPPG_CTRL_VEHI_RFID.pppr_inse_etiq";
        private const string PROCEDIMIENTO_RFID_MODIFICARETIQUETA = "BETA.PPPG_CTRL_VEHI_RFID.pppr_modi_etiq";
        private const string PROCEDIMIENTO_RFID_OBTENERETIQUETA = "BETA.PPPG_CTRL_VEHI_RFID.pppr_busq_etiq";
        private const string PROCEDIMIENTO_RFID_CONTARETIQUETA = "BETA.PPPG_CTRL_VEHI_RFID.pppr_cuen_etiq";
        // Parametros Entrada

        //Registrar
        private const string PARAM_COD_EPC = "PV_COD_EPC";
        private const string PARAM_ERRO = "PN_ERRO";
        private const string PARAM_MENS = "PV_MENS";
        private const string PARAM_COD_VEHI = "COD_VEHI";
        private const string PARAM_IND_ACTI = "IND_ACTI";
        private const string PARAM_NOM_COMP_CREA = "NOM_COMP_CREA";
        private const string PARAM_COD_USUA_CREA = "COD_USUA_CREA";

        //Modificar
        private const string PARAM_NOM_COMP_MODI = "PV_NOM_COMP_MODI";
        private const string PARAM_COD_USUA_MODI = "PV_COD_USUA_MODI";

        // Parametros Salida
        private const string PARAM_CURSOR = "PC_LIST";

        private const string CODEPC = "COD_EPC";
        private const string CODVEHI = "COD_VEHI";
        private const string INDACTI = "IND_ACTI";
        private const string NOMCOMPCREA = "NOM_COMP_CREA";
        private const string CODUSUACREA = "COD_USUA_CREA";
        private const string NOMCOMPMODI = "NOM_COMP_MODI";
        private const string CODUSUAMODI = "COD_USUA_MODI";
        private const string FECCREA = "FEC_CREA";
        private const string FECMODI = "FEC_MODI";
        
        private const string CONTAR = "contar";
        //private const string MENS = "MENS";

        #endregion

        #region --- Metodos Propios ---
        public Etiqueta obtenerEtiqueta(Etiqueta etiqueta)
        {
            Etiqueta etiquetaResultado = null;

            DataSet dsEtiqueta = new DataSet();

            if (log.IsDebugEnabled)
            {
                log.Debug("obtenerEtiqueta(" + etiqueta.codEpc + ")");
            }

            using (Database db = new Database(ConstantesDAO.NombreInterface.ConexHermes))
            {
                db.NombreProcedimiento = PROCEDIMIENTO_RFID_OBTENERETIQUETA;
                db.agregarParametro(PARAM_COD_EPC, DbType.String, ParameterDirection.Input, etiqueta.codEpc);
                db.agregarParametro(PARAM_CURSOR, DbType.Binary, ParameterDirection.Output, null);

                IDataAdapter dataAdapter = db.obtenerDataAdapter();
                dataAdapter.Fill(dsEtiqueta);

                if (dsEtiqueta.Tables.Count > 0)
                {
                    etiquetaResultado = generarEntidad(dsEtiqueta.Tables[0].Rows[0]);

                }
            }

            return etiquetaResultado;
        }

        public int contarEtiqueta(Etiqueta etiqueta)
        {
            int iContar = 0;

            DataSet dsEtiqueta = new DataSet();

            if (log.IsDebugEnabled)
            {
                log.Debug("contarEtiqueta(" + etiqueta.codEpc + ")");
            }

            using (Database db = new Database(ConstantesDAO.NombreInterface.ConexHermes))
            {
                db.NombreProcedimiento = PROCEDIMIENTO_RFID_CONTARETIQUETA;
                db.agregarParametro(PARAM_COD_EPC, DbType.String, ParameterDirection.Input, etiqueta.codEpc);
                db.agregarParametro(PARAM_CURSOR, DbType.Binary, ParameterDirection.Output, null);

                IDataAdapter dataAdapter = db.obtenerDataAdapter();
                dataAdapter.Fill(dsEtiqueta);

                if (dsEtiqueta.Tables.Count > 0)
                {
                    
                    iContar = Convert.ToInt32(dsEtiqueta.Tables[0].Rows[0][CONTAR]);
                }
            }

            return iContar;
        }

        private Etiqueta generarEntidad(DataRow fila)
        {
            Etiqueta etiqueta = new Etiqueta();
            
            etiqueta.codEpc = fila[CODEPC].ToString();
            etiqueta.codUsuaCrea = fila[CODUSUACREA].ToString();
            etiqueta.codUsuaModi = fila[CODUSUAMODI].ToString();
            etiqueta.codVehiculo = fila[CODVEHI].ToString();
            etiqueta.indActi = Convert.ToInt32(fila[INDACTI]);
            etiqueta.nomCompCrea = fila[NOMCOMPCREA].ToString();
            etiqueta.nomCompModi = fila[NOMCOMPMODI].ToString();
            etiqueta.fecCrea = Convert.ToDateTime(fila[FECCREA]);
            etiqueta.fecModi = Convert.ToDateTime(fila[FECMODI]);


            return etiqueta;
        }

        public Boolean registrarEtiqueta(Etiqueta etiqueta)
        {
            Boolean Registrar = false;
            DataSet dsRegistrarEtiqueta = new DataSet();

            if (log.IsDebugEnabled)
            {
                log.Debug("registrarEtiqueta()");
            }

            using (Database db = new Database(ConstantesDAO.NombreInterface.ConexHermes))
            {
                db.NombreProcedimiento = PROCEDIMIENTO_RFID_REGISTRARETIQUETA;
                db.agregarParametro(PARAM_COD_EPC, DbType.String, ParameterDirection.Input, etiqueta.codEpc);
                db.agregarParametro(PARAM_COD_VEHI, DbType.String, ParameterDirection.Input, etiqueta.codVehiculo);
                db.agregarParametro(PARAM_IND_ACTI, DbType.Int32, ParameterDirection.Input, etiqueta.indActi);
                db.agregarParametro(PARAM_NOM_COMP_CREA, DbType.String, ParameterDirection.Input, etiqueta.nomCompCrea);
                db.agregarParametro(PARAM_COD_USUA_CREA, DbType.String, ParameterDirection.Input, etiqueta.codUsuaCrea);
                db.agregarParametro(PARAM_NOM_COMP_MODI, DbType.String, ParameterDirection.Input, etiqueta.nomCompModi);
                db.agregarParametro(PARAM_COD_USUA_MODI, DbType.String, ParameterDirection.Input, etiqueta.codUsuaModi);
                db.agregarParametro(PARAM_CURSOR, DbType.Binary, ParameterDirection.Output, null);

                IDataAdapter dataAdapter = db.obtenerDataAdapter();
                dataAdapter.Fill(dsRegistrarEtiqueta);

                if (dsRegistrarEtiqueta.Tables.Count > 0)
                {
                    Registrar = true;
                }
            }
            return Registrar;
        }      

        public Boolean modificarEtiqueta(Etiqueta etiqueta)
        {
            Boolean Modificar = false;
            DataSet dsModificarEtiqueta = new DataSet();

            if (log.IsDebugEnabled)
            {
                log.Debug("modificarEtiqueta()");
            }

            using (Database db = new Database(ConstantesDAO.NombreInterface.ConexHermes))
            {
                db.NombreProcedimiento = PROCEDIMIENTO_RFID_MODIFICARETIQUETA;
                db.agregarParametro(PARAM_COD_EPC, DbType.String, ParameterDirection.Input, etiqueta.codEpc);
                db.agregarParametro(PARAM_IND_ACTI, DbType.Int32, ParameterDirection.Input, etiqueta.indActi);
                db.agregarParametro(PARAM_NOM_COMP_MODI, DbType.String, ParameterDirection.Input, etiqueta.nomCompModi);
                db.agregarParametro(PARAM_COD_USUA_MODI, DbType.String, ParameterDirection.Input, etiqueta.codUsuaModi);

                IDataAdapter dataAdapter = db.obtenerDataAdapter();
                dataAdapter.Fill(dsModificarEtiqueta);

                if (dsModificarEtiqueta.Tables.Count > 0)
                {
                    Modificar = true;
                }
            }
            return Modificar;
        }      
        #endregion
     }
}
